package main

import (
	"fmt"
	"log"
	"net/http"
)

/*
*
我们设置了2个路由，/和/hello，分别绑定 indexHandler 和 helloHandler ，
根据不同的HTTP请求会调用不同的处理函数。
访问/，响应是URL.Path = /，而/hello的响应则是请求头(header)中的键值对信息。
*/
func main() {
	http.HandleFunc("/", index)
	http.HandleFunc("/hello", hello)
	//ListenAndServe的第一个参数是端口号第二个参数代表处理所有http请求的实例
	//:8083表示在 9999 端口监听。
	//nil 代表使用标准库中的实例处理
	log.Fatal(http.ListenAndServe(":8083", nil))
}

/*
*
http.ResponseWriter 是用于构建HTTP响应的接口，
而 *http.Request 则表示HTTP请求的数据结构,

*http.Request 和 http.Request 的区别
*http.Request：表示指向 http.Request 类型的指针。在Go语言中，使用指针可以直接修改原始数据而不是复制数据，
这在处理HTTP请求时尤其有用。通常，HTTP处理函数的参数会声明为 *http.Request 类型，以便可以对请求进行修改或者检查请求的属性。
http.Request：表示HTTP请求的结构体。这个结构体包含了HTTP请求的各种属性，
例如URL、请求头、请求方法等等。在一些特定的情况下，可以直接使用 http.Request 类型来处理HTTP请求，但是这样做将会对原始数据进行复制，
可能会导致性能损失或者不必要的内存开销。
总的来说，*http.Request 是一个指向 http.Request 结构体的指针，用于对HTTP请求进行处理和修改；
而 http.Request 是HTTP请求的结构体本身，包含了请求的所有属性。
*/
func index(w http.ResponseWriter, r *http.Request) {
	/**
	fmt.Fprintf 将格式化的字符串写入 http.ResponseWriter
	*/
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path) //URL.Path = "/"
}

/*
*
r.Header 是一个 map，其中包含了HTTP请求的所有头部字段及其对应的值。k 是头部字段的键（名称），v 是对应的值
*/
func hello(w http.ResponseWriter, r *http.Request) {
	for k, v := range r.Header {
		fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
	}
	//Header["User-Agent"] = ["apifox/1.0.0 (https://www.apifox.cn)"]
	//Header["Accept"] = ["*/*"]
	//Header["Accept-Encoding"] = ["gzip, deflate, br"]
	//Header["Connection"] = ["keep-alive"]
	//Header["Content-Length"] = ["0"]
}
